# coding:utf-8
'''
Created on 2011-3-5
getattr()内置函数的高级应用。
getattr()是Python自省机制的核心。
@author: Administrator
'''

#==================================
# getattr()也可以用于模块
#==================================
import apihelper
infoFunc = getattr(apihelper, 'info')
print infoFunc
print type(infoFunc)
print callable(infoFunc)

#====================================================================
# getattr()作为分发者。getattr常见的使用模式就是作为一个分发者。例如，如果
# 有一个程序可以以不同的格式输出数据，那么可以为每种输出格式定义各自的输出
# 函数，然后使用唯一的分发函数调用所需的格式输出函数。
#====================================================================
import statsout # statsout是一个假设的模块，实际没有这个模块，所以运行时会出错
def output(data, format="text"):
    # getattr第三个参数是默认值。如果没有默认值，那么当在statsout中找不到相应函数时会返回None
    # 这会output_func(data)会抛异常。如果有默认值，那么在找不到相应函数时就会返回默认值
    output_func = getattr(statsout, 'output_%s' % format, statsout.output_text)
    return output_func(data)
